// internal/planner/optimizer/rules.go
package optimizer

import (
	"NumberBase/internal/planner/logical"
	"NumberBase/internal/planner/types"
)

// PredicatePushDown 谓词下推规则
type PredicatePushDown struct{}

// Apply 实现谓词下推
func (r *PredicatePushDown) Apply(plan types.LogicalPlan) types.LogicalPlan {
	switch node := plan.(type) {
	case *logical.Projection:
		// 投影下的过滤下推
		if filter, ok := node.Children()[0].(*logical.Filter); ok {
			// 谓词下推到表扫描
			if _, scanOK := filter.Children()[0].(*logical.TableScan); scanOK {
				// 优化后的结构: Projection -> Filter -> TableScan 不变
				// 但在物理计划中可能会利用索引优化此模式
				return node
			}
		}
		// 其他模式...
	}

	return plan // 默认不变
}

// ProjectionPruning 列裁剪规则
type ProjectionPruning struct{}

// Apply 实现列裁剪
func (r *ProjectionPruning) Apply(plan types.LogicalPlan) types.LogicalPlan {
	// 实现列裁剪逻辑...
	return plan
}

// 其他优化规则...
